Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / tests / backend / test_page_node.py

Displaying Raw • Download


tests/backend/test_page_node.py 824d84e3aca83dea2c4ae7db37ed265790454281 (824d84e3) Text, 14.15 KB

Tff7b72import T7ee787os
Tff7b72import T7ee787shutil
Tff7b72import T7ee787tempfile
Tff7b72from T7ee787unittestT7ee787.T7ee787mock Tff7b72import Te6edf3MagicMockTb4b4b4, Te6edf3patch

Tff7b72import T7ee787pytest


Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffnode_dirTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3d Tff7b72= Te6edf3tempfileTff7b72.Td2a8ffmkdtempTb4b4b4(Tb4b4b4)
Tff7b72yield Te6edf3d
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3dTb4b4b4, Te6edf3ignore_errorsTff7b72=Tff7b72TrueTb4b4b4)


Tf0883e@pytestTff7b72.Td2a8fffixture
Tff7b72def Td2a8ffmock_rnsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3patchTb4b4b4(Ta5d6ff"Ta5d6ffmeshchatx.src.backend.page_node.RNSTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3mockTb4b4b4:
Te6edf3mock_identity Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_identityTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x01Ta5d6ff" Tff7b72* T79c0ff16
Te6edf3mock_identityTff7b72.Td2a8ffget_public_keyTff7b72.Td2a8ffreturn_value Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x02Ta5d6ff" Tff7b72* T79c0ff64

Te6edf3mock_destination Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3mock_destinationTff7b72.Td2a8ffhash Tff7b72= Ta5d6ffbTa5d6ff"Tffea00\x03Ta5d6ff" Tff7b72* T79c0ff16

Te6edf3mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_identity
Te6edf3mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_identity
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffreturn_value Tff7b72= Te6edf3mock_destination
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffIN Tff7b72= T79c0ff1
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLE Tff7b72= T79c0ff0
Te6edf3mockTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffALLOW_ALL Tff7b72= T79c0ff0xFF
Te6edf3mockTff7b72.Td2a8ffTransport Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)

Tff7b72yield Te6edf3mockTb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3mock_destination


Tff7b72def Td2a8ff_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode

Te6edf3_Tb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Tff7b72return Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-1Ta5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Te6edf3identityTff7b72=Te6edf3mock_identityTb4b4b4,
Tb4b4b4)


Tff7b72class T56d364TestPageNodeSetupTb4b4b4:
Tff7b72def Td2a8fftest_setup_creates_directoriesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffrunning Tff7b72is Tff7b72True

Tff7b72def Td2a8fftest_setup_returns_destination_hash_hexTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3result Tff7b72= Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657strTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72== T79c0ff32

Tff7b72def Td2a8fftest_setup_creates_identity_when_noneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode

Te6edf3rns_mockTb4b4b4, Te6edf3_Tb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-2Ta5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffNo Identity NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3rns_mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fftest_setup_loads_identity_from_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode

Te6edf3rns_mockTb4b4b4, Te6edf3mock_identityTb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3identity_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3node_dirTb4b4b4, Ta5d6ff"Ta5d6ffidentityTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3identity_pathTb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6fffakeTa5d6ff"Tb4b4b4)

Te6edf3node Tff7b72= Te6edf3PageNodeTb4b4b4(
Te6edf3node_idTff7b72=Ta5d6ff"Ta5d6fftest-node-3Ta5d6ff"Tb4b4b4,
Te6edf3nameTff7b72=Ta5d6ff"Ta5d6ffFile Identity NodeTa5d6ff"Tb4b4b4,
Te6edf3base_dirTff7b72=Te6edf3node_dirTb4b4b4,
Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3rns_mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTff7b72.Td2a8ffassert_called_withTb4b4b4(Te6edf3identity_pathTb4b4b4)

Tff7b72def Td2a8fftest_setup_registers_link_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3mock_destTff7b72.Td2a8ffset_link_established_callbackTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fftest_setup_calls_ensure_local_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3rns_mockTb4b4b4, Te6edf3_Tb4b4b4, Te6edf3_ Tff7b72= Te6edf3mock_rns
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3rns_mockTff7b72.Td2a8ffIdentityTff7b72.Td2a8ffrememberTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)


Tff7b72class T56d364TestPageNodeTeardownTb4b4b4:
Tff7b72def Td2a8fftest_teardown_sets_running_falseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffrunning Tff7b72is Tff7b72False
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffdestination Tff7b72is Tff7b72None

Tff7b72def Td2a8fftest_teardown_deregisters_handlersTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6fftest.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6fftest.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3mock_destTff7b72.Td2a8ffderegister_request_handlerTff7b72.Td2a8ffcall_count Tff7b72>Tff7b72= T79c0ff2

Tff7b72def Td2a8fftest_teardown_clears_active_linksTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_link Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mock_linkTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffactive_linksTb4b4b4) Tff7b72== T79c0ff0
Te6edf3mock_linkTff7b72.Td2a8ffteardownTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)


Tff7b72class T56d364TestPageNodeAnnounceTb4b4b4:
Tff7b72def Td2a8fftest_announce_calls_destination_announceTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fftest_announce_skips_when_not_runningTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffassert_not_calledTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fftest_announce_passes_name_as_app_dataTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffannounceTb4b4b4(Tb4b4b4)
Te6edf3call_kwargs Tff7b72= Te6edf3mock_destTff7b72.Td2a8ffannounceTff7b72.Td2a8ffcall_args
Tff7b72assert Te6edf3call_kwargsTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffapp_dataTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffTest NodeTa5d6ff"


Tff7b72class T56d364TestPageNodePagesTb4b4b4:
Tff7b72def Td2a8fftest_add_page_writes_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHello WorldTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffhello.muTa5d6ff"
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffhello.muTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffHello WorldTa5d6ff"

Tff7b72def Td2a8fftest_add_page_appends_mu_extensionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6fftestTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftest.muTa5d6ff"

Tff7b72def Td2a8fftest_add_page_preserves_mu_extensionTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6fftest.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffxTa5d6ff"Tb4b4b4) Tff7b72== Ta5d6ff"Ta5d6fftest.muTa5d6ff"

Tff7b72def Td2a8fftest_add_page_registers_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3_Tb4b4b4, Te6edf3mock_dest Tff7b72= Te6edf3mock_rns
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffcontentTa5d6ff"Tb4b4b4)
Te6edf3mock_destTff7b72.Td2a8ffregister_request_handlerTff7b72.Td2a8ffassert_calledTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/index.muTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths

Tff7b72def Td2a8fftest_remove_page_deletes_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffdeleteme.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffgoneTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_pageTb4b4b4(Ta5d6ff"Ta5d6ffdeleteme.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffdeleteme.muTa5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8fftest_remove_nonexistent_page_returns_falseTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_pageTb4b4b4(Ta5d6ff"Ta5d6ffnope.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False

Tff7b72def Td2a8fftest_list_pagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffb.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffbTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffa.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4)
Te6edf3pages Tff7b72= Te6edf3nodeTff7b72.Td2a8fflist_pagesTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3pages Tff7b72== Tb4b4b4[Ta5d6ff"Ta5d6ffa.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffb.muTa5d6ff"Tb4b4b4]

Tff7b72def Td2a8fftest_get_page_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffHello MeshTa5d6ff"Tb4b4b4)
Te6edf3content Tff7b72= Te6edf3nodeTff7b72.Td2a8ffget_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3content Tff7b72== Ta5d6ff"Ta5d6ffHello MeshTa5d6ff"

Tff7b72def Td2a8fftest_get_page_content_nonexistentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_page_contentTb4b4b4(Ta5d6ff"Ta5d6ffnope.muTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72None


Tff7b72class T56d364TestPageNodeFilesTb4b4b4:
Tff7b72def Td2a8fftest_add_file_writes_binaryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffdoc.pdfTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\x00Tffea00\x01Tffea00\x02Ta5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffdoc.pdfTa5d6ff"
Te6edf3path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffdoc.pdfTa5d6ff"Tb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Tff7b72assert Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Tffea00\x00Tffea00\x01Tffea00\x02Ta5d6ff"

Tff7b72def Td2a8fftest_add_file_registers_handlerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffinfo.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/file/info.txtTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_file_paths

Tff7b72def Td2a8fftest_remove_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffrm.binTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\xffTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_fileTb4b4b4(Ta5d6ff"Ta5d6ffrm.binTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72True
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffrm.binTa5d6ff"Tb4b4b4)Tb4b4b4)

Tff7b72def Td2a8fftest_remove_nonexistent_fileTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffremove_fileTb4b4b4(Ta5d6ff"Ta5d6ffnope.binTa5d6ff"Tb4b4b4) Tff7b72is Tff7b72False

Tff7b72def Td2a8fftest_list_filesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffb.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffbbTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffa.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffaTa5d6ff"Tb4b4b4)
Te6edf3files Tff7b72= Te6edf3nodeTff7b72.Td2a8fflist_filesTb4b4b4(Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3filesTb4b4b4) Tff7b72== T79c0ff2
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffa.txtTa5d6ff"
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffb.txtTa5d6ff"
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Tff7b72assert Te6edf3filesTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffsizeTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff2


Tff7b72class T56d364TestPageNodeRespondersTb4b4b4:
Tff7b72def Td2a8fftest_page_responder_returns_contentTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffpage contentTa5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/page/index.muTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflink1Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffpage contentTa5d6ff"

Tff7b72def Td2a8fftest_page_responder_missing_returns_noneTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_page_responderTb4b4b4(Ta5d6ff"Ta5d6ffmissing.muTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/page/missing.muTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflink1Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3result Tff7b72is Tff7b72None

Tff7b72def Td2a8fftest_file_responder_returns_listTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6ffdata.binTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Tffea00\x01Tffea00\x02Tffea00\x03Ta5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_file_responderTb4b4b4(Ta5d6ff"Ta5d6ffdata.binTa5d6ff"Tb4b4b4)
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/data.binTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffreq1Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflink1Ta5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3resultTb4b4b4, Tffa657listTb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3resultTb4b4b4) Tff7b72== T79c0ff2
Te6edf3file_handle Tff7b72= Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3metadata Tff7b72= Te6edf3resultTb4b4b4[T79c0ff1Tb4b4b4]
Tff7b72assert Te6edf3file_handleTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4) Tff7b72== Ta5d6ffbTa5d6ff"Tffea00\x01Tffea00\x02Tffea00\x03Ta5d6ff"
Tff7b72assert Te6edf3metadataTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ffbTa5d6ff"Ta5d6ffdata.binTa5d6ff"
Te6edf3file_handleTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fftest_file_responder_increments_statsTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_fileTb4b4b4(Ta5d6ff"Ta5d6fff.txtTa5d6ff"Tb4b4b4, Ta5d6ffbTa5d6ff"Ta5d6ffhelloTa5d6ff"Tb4b4b4)
Te6edf3responder Tff7b72= Te6edf3nodeTff7b72.Td2a8ff_make_file_responderTb4b4b4(Ta5d6ff"Ta5d6fff.txtTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fffiles_servedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff0
Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/f.txtTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fffiles_servedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Te6edf3result Tff7b72= Te6edf3responderTb4b4b4(Ta5d6ff"Ta5d6ff/file/f.txtTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, Ta5d6ff"Ta5d6ffrTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6fflTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4, T79c0ff0Tb4b4b4)
Te6edf3resultTb4b4b4[T79c0ff0Tb4b4b4]Tff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fffiles_servedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff2


Tff7b72class T56d364TestPageNodeConfigTb4b4b4:
Tff7b72def Td2a8fftest_save_and_load_configTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsave_configTb4b4b4(Tb4b4b4)
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode

Te6edf3config Tff7b72= Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4)
Tff7b72assert Te6edf3config Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffnode_idTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fftest-node-1Ta5d6ff"
Tff7b72assert Te6edf3configTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"

Tff7b72def Td2a8fftest_load_config_missingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787page_node Tff7b72import Te6edf3PageNode

Tff7b72assert Te6edf3PageNodeTff7b72.Td2a8ffload_configTb4b4b4(Te6edf3node_dirTb4b4b4) Tff7b72is Tff7b72None


Tff7b72class T56d364TestPageNodeStatusTb4b4b4:
Tff7b72def Td2a8fftest_get_statusTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffindex.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffhiTa5d6ff"Tb4b4b4)
Te6edf3status Tff7b72= Te6edf3nodeTff7b72.Td2a8ffget_statusTb4b4b4(Tb4b4b4)
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffnode_idTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6fftest-node-1Ta5d6ff"
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4] Tff7b72== Ta5d6ff"Ta5d6ffTest NodeTa5d6ff"
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72True
Tff7b72assert Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffdestination_hashTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72not Tff7b72None
Tff7b72assert Ta5d6ff"Ta5d6ffindex.muTa5d6ff" Tff7b72in Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffpagesTa5d6ff"Tb4b4b4]
Tff7b72assert Tffa657isinstanceTb4b4b4(Te6edf3statusTb4b4b4[Ta5d6ff"Ta5d6ffstatsTa5d6ff"Tb4b4b4]Tb4b4b4, Tffa657dictTb4b4b4)

Tff7b72def Td2a8fftest_get_destination_hash_when_not_runningTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ffget_destination_hashTb4b4b4(Tb4b4b4) Tff7b72is Tff7b72None


Tff7b72class T56d364TestPageNodeLinkCallbacksTb4b4b4:
Tff7b72def Td2a8fftest_link_established_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_link Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ff_link_establishedTb4b4b4(Te6edf3mock_linkTb4b4b4)
Tff7b72assert Te6edf3mock_link Tff7b72in Te6edf3nodeTff7b72.Td2a8ffactive_links
Tff7b72assert Te6edf3nodeTff7b72.Td2a8ff_statsTb4b4b4[Ta5d6ff"Ta5d6fflinks_establishedTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1
Te6edf3mock_linkTff7b72.Td2a8ffset_link_closed_callbackTff7b72.Td2a8ffassert_called_onceTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8fftest_link_closed_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3mock_link Tff7b72= Te6edf3MagicMockTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffactive_linksTff7b72.Td2a8ffappendTb4b4b4(Te6edf3mock_linkTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ff_link_closedTb4b4b4(Te6edf3mock_linkTb4b4b4)
Tff7b72assert Te6edf3mock_link Tff7b72not Tff7b72in Te6edf3nodeTff7b72.Td2a8ffactive_links

Tff7b72def Td2a8fftest_link_closed_callback_ignores_unknownTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ff_link_closedTb4b4b4(Te6edf3MagicMockTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72assert Tffa657lenTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffactive_linksTb4b4b4) Tff7b72== T79c0ff0


Tff7b72class T56d364TestPageNodeEdgeCasesTb4b4b4:
Tff7b72def Td2a8fftest_add_page_before_runningTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ffoffline.muTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffdataTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffoffline.muTa5d6ff"
Tff7b72assert Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffoffline.muTa5d6ff"Tb4b4b4)Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/offline.muTa5d6ff" Tff7b72not Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths

Tff7b72def Td2a8fftest_setup_registers_existing_pagesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8ffpages_dirTb4b4b4, Ta5d6ff"Ta5d6ffpre.muTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ff"Ta5d6ffexistingTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/page/pre.muTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_page_paths

Tff7b72def Td2a8fftest_setup_registers_existing_filesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3nodeTff7b72.Td2a8fffiles_dirTb4b4b4, Ta5d6ff"Ta5d6ffpre.txtTa5d6ff"Tb4b4b4)Tb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Ta5d6ffbTa5d6ff"Ta5d6ffexistingTa5d6ff"Tb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Tff7b72assert Ta5d6ff"Ta5d6ff/file/pre.txtTa5d6ff" Tff7b72in Te6edf3nodeTff7b72.Td2a8ff_registered_file_paths

Tff7b72def Td2a8fftest_path_traversal_blockedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)Tb4b4b4:
Te6edf3node Tff7b72= Te6edf3_make_nodeTb4b4b4(Te6edf3node_dirTb4b4b4, Te6edf3mock_rnsTb4b4b4)
Te6edf3nodeTff7b72.Td2a8ffsetupTb4b4b4(Tb4b4b4)
Te6edf3name Tff7b72= Te6edf3nodeTff7b72.Td2a8ffadd_pageTb4b4b4(Ta5d6ff"Ta5d6ff../../etc/passwdTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffmaliciousTa5d6ff"Tb4b4b4)
Tff7b72assert Te6edf3name Tff7b72== Ta5d6ff"Ta5d6ffpasswd.muTa5d6ff"
Tff7b72assert Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffexistsTb4b4b4(Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3node_dirTb4b4b4, Ta5d6ff"Ta5d6ff..Ta5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffetcTa5d6ff"Tb4b4b4)Tb4b4b4)


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────